package so.obligatorio.procesos;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Semaphore;

import so.obligatorio.modelo.Espectaculo;

public class PDVCentral {
	private static PDVCentral instance;
	private Espectaculo espectaculo;
	private Semaphore semaphore;

	public static PDVCentral getInstance() {
		if(instance == null) {
			instance = new PDVCentral();
		}
		return instance;
	}

	public Espectaculo getEspectaculo() {
		return this.espectaculo;
	}

	public Semaphore getSemaphore() {
		return this.semaphore;
	}

	private PDVCentral() {
		this.semaphore = new Semaphore(1);
	}

	public boolean obtenerEntradas(Integer cantidad) {
		List<Integer> entradas = espectaculo.getEntradas();
		boolean result = false;
		List<Integer> subEntradas = new ArrayList<Integer>();

		if (entradas.size() > cantidad) {
			boolean flag = true;
			while (flag) {
				for (int i = 0; i < entradas.size() && !result && flag; i++) {
					if (entradas.size() >= cantidad + i) {
						subEntradas = entradas.subList(i, i + cantidad);
						if (entradasContiunas(subEntradas)) {
							result = true;
							flag = false;
						}
					} else {
						flag = false;
					}
				}
			}
			if (result) {
				entradas.removeAll(subEntradas);
			}
		}

		return result;
	}

	/**
	 * Indica si la lista provista es de numeros contiguos
	 * @param lista
	 * @return
	 */
	public static boolean entradasContiunas(List<Integer> lista) {
		boolean flag = true;
		for (int i = 1; i < lista.size() && flag; i++) {
			Integer actual = lista.get(i-1);
			Integer siguiente = lista.get(i);

			if (!siguiente.equals(actual + 1)) {
				flag = false;
			}
		}
		return flag;
	}

	public void setEspectaculo(Espectaculo espectaculo) {
		this.espectaculo = espectaculo;
	}

}
